package Produto;
//@Jorge Neto

import Banco.LinkDB;
import com.mysql.jdbc.PreparedStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class RepositorioProduto implements InterfaceProduto {

    @Override
    public void inserirProduto(String codigoBarras, String nome, String descricao,
            String tipo, String quantidade, String valorEntrada, String valorSaida,
            String dataEntrada, String dataSaida, String peso, String dataValidade,
            String fornecedor) throws SQLException, ClassNotFoundException {

        long refQuantidade = Long.parseLong(quantidade);
        double refValorEntrada = Double.parseDouble(valorEntrada);
        double refValorSaida = Double.parseDouble(valorSaida);
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        java.sql.Date refDataSaida = null;
        java.sql.Date refDataEntrada = null;
        try {
            refDataSaida = new java.sql.Date(format.parse(dataSaida).getTime());
            refDataEntrada = new java.sql.Date(format.parse(dataEntrada).getTime());
        } catch (ParseException ex) {
            Logger.getLogger(RepositorioProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
        double refPeso = Double.parseDouble(peso);
        int refFornecedor = Integer.parseInt(fornecedor);


        Produto p1 = new Produto();

        p1.setCodigoBarras(codigoBarras);
        p1.setNomeProduto(nome);
        p1.setDescricao(descricao);
        p1.setTipo(tipo);
        p1.setQuantidade(refQuantidade);
        p1.setValorEntrada(refValorEntrada);
        p1.setValorSaida(refValorSaida);
        p1.setDataEntrada(refDataEntrada);
        p1.setDataSaida(refDataSaida);
        p1.setDataValidade(dataValidade);
        p1.setPeso(refPeso);
        p1.setCodigoFornecedor(refFornecedor);


        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;

            query = "INSERT INTO produtos (codigoBarrasProduto, nomeProduto,"
                    + "descricaoProduto, tipoProduto, quantidadeProduto, valorEntradaProduto,"
                    + "valorSaidaProduto, dataEntradaProduto, dataSaidaProduto,"
                    + "pesoProduto, dataValidadeProduto, codigoFornecedor) VALUES (?, ?, ?, ?, ? ,? ,?, ?, ?, ?, ?, ?)";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setString(1, p1.getCodigoBarras().toString());
            stmt.setString(2, p1.getNomeProduto().toUpperCase());
            stmt.setString(3, p1.getDescricao().toUpperCase());
            stmt.setString(4, p1.getTipo().toUpperCase());
            stmt.setLong(5, p1.getQuantidade());
            stmt.setDouble(6, p1.getValorEntrada());
            stmt.setDouble(7, p1.getValorSaida());
            stmt.setDate(8, p1.getDataEntrada());
            stmt.setDate(9, p1.getDataSaida());
            stmt.setDouble(10, p1.getPeso());
            stmt.setString(11, p1.getDataValidade());
            stmt.setLong(12, p1.getCodigoFornecedor());

            stmt.executeUpdate();
            stmt.close();
            conn.close();


        } catch (SQLException ex) {
            //throw new SQLException(ex.getMessage());
            JOptionPane.showMessageDialog(null, ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }


    }

    @Override
    public void excluirProduto(String codigoBarras) throws SQLException, ClassNotFoundException {
        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;

            query = "DELETE FROM produtos WHERE codigoBarrasProduto = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setString(1, codigoBarras);

            stmt.executeUpdate();
            stmt.close();
            conn.close();

        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }

    }

    @Override
    public void alterarProduto(String codigoBarras, String nome, String descricao,
            String tipo, String quantidade, String valorEntrada, String valorSaida,
            String dataEntrada, String dataSaida, String peso, String dataValidade,
            String fornecedor) throws SQLException, ClassNotFoundException {

        long refCodigoBarras = Long.parseLong(codigoBarras);
        long refQuantidade = Long.parseLong(quantidade);
        double refValorEntrada = Double.parseDouble(valorEntrada);
        double refValorSaida = Double.parseDouble(valorSaida);
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        java.sql.Date refDataSaida = null;
        java.sql.Date refDataEntrada = null;
        try {
            refDataSaida = new java.sql.Date(format.parse(dataSaida).getTime());
            refDataEntrada = new java.sql.Date(format.parse(dataEntrada).getTime());
        } catch (ParseException ex) {
            Logger.getLogger(RepositorioProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
        double refPeso = Double.parseDouble(peso);
        int refFornecedor = Integer.parseInt(fornecedor);

        try {

            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;

            query = "UPDATE produtos SET nomeProduto = ?, descricaoProduto = ?,"
                    + "tipoProduto = ?, quantidadeProduto = ?, valorEntradaProduto = ?,"
                    + "valorSaidaProduto = ?, dataEntradaProduto = ?, dataSaidaProduto = ?,"
                    + "pesoProduto = ?, dataValidadeProduto = ?, codigoFornecedor = ? "
                    + "WHERE codigoBarrasProduto = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setString(1, nome.toUpperCase());
            stmt.setString(2, descricao.toUpperCase());
            stmt.setString(3, tipo.toUpperCase());
            stmt.setLong(4, refQuantidade);
            stmt.setDouble(5, refValorEntrada);
            stmt.setDouble(6, refValorSaida);
            stmt.setDate(7, refDataEntrada);
            stmt.setDate(8, refDataSaida);
            stmt.setDouble(9, refPeso);
            stmt.setString(10, dataValidade);
            stmt.setInt(11, refFornecedor);
            stmt.setLong(12, refCodigoBarras);

            stmt.executeUpdate();
            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }

    }

    @Override
    public Produto consultarProdutoCodigoBarras(String codigoBarras)
            throws SQLException, ClassNotFoundException {
        Produto p1 = new Produto();
        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;
            ResultSet rs;

            query = "SELECT * FROM produtos WHERE codigoBarrasProduto = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setString(1, codigoBarras.toString());

            rs = stmt.executeQuery();

            while (rs.next()) {
                p1.setCodigoBarras(rs.getString(1));
                p1.setNomeProduto(rs.getString(2));
                p1.setDescricao(rs.getString(3));
                p1.setTipo(rs.getString(4));
                p1.setQuantidade(rs.getLong(5));
                p1.setValorEntrada(rs.getDouble(6));
                p1.setValorSaida(rs.getDouble(7));
                p1.setDataEntrada(rs.getDate(8));
                p1.setDataSaida(rs.getDate(9));
                p1.setPeso(rs.getDouble(10));
                p1.setDataValidade(rs.getString(11));
                p1.setCodigoFornecedor(rs.getInt(12));

            }
            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }

        return p1;

    }

    @Override
    public ArrayList consultarProdutoNome(String nome)
            throws SQLException, ClassNotFoundException {

        Produto p1 = new Produto();
        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;
            ResultSet rs;

            query = "SELECT * FROM produtos WHERE nomeProduto = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setString(1, nome);

            rs = stmt.executeQuery();

            ArrayList list = new ArrayList();

            while (rs.next()) {
                p1.setCodigoBarras(rs.getString("codigoBarrasProduto"));
                p1.setNomeProduto(rs.getString("nomeProduto"));
                p1.setDescricao(rs.getString("descricaoProduto"));
                p1.setTipo(rs.getString("tipoProduto"));
                p1.setQuantidade(rs.getLong("quantidadeProduto"));
                p1.setValorEntrada(rs.getDouble("valorEntradaProduto"));
                p1.setValorSaida(rs.getDouble("valorSaidaProduto"));
                p1.setDataEntrada(rs.getDate("dataEntradaProduto"));
                p1.setDataSaida(rs.getDate("dataSaidaProduto"));
                p1.setPeso(rs.getDouble("pesoProduto"));
                p1.setDataValidade(rs.getString("dataValidadeProduto"));
                p1.setCodigoFornecedor(rs.getInt("codigoFornecedor"));
                list.add(p1.getCodigoBarras());
                list.add(p1.getNomeProduto());
                list.add(p1.getDescricao());
                list.add(p1.getTipo());
                list.add(p1.getQuantidade());
                list.add(p1.getValorEntrada());
                list.add(p1.getValorSaida());
                list.add(p1.getDataEntrada());
                list.add(p1.getDataSaida());
                list.add(p1.getPeso());
                list.add(p1.getDataValidade());
                list.add(p1.getCodigoFornecedor());
            }

            stmt.close();
            conn.close();

            return list;

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }

    }

    @Override
    public ArrayList consultarProdutoTipo(String tipoProduto)
            throws SQLException, ClassNotFoundException {

        Produto p1 = new Produto();
        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;
            ResultSet rs;

            query = "SELECT * FROM produtos WHERE tipoProduto = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setString(1, tipoProduto);

            rs = stmt.executeQuery();

            ArrayList list = new ArrayList();

            while (rs.next()) {
                p1.setCodigoBarras(rs.getString("codigoBarrasProduto"));
                p1.setNomeProduto(rs.getString("nomeProduto"));
                p1.setDescricao(rs.getString("descricaoProduto"));
                p1.setTipo(rs.getString("tipoProduto"));
                p1.setQuantidade(rs.getLong("quantidadeProduto"));
                p1.setValorEntrada(rs.getDouble("valorEntradaProduto"));
                p1.setValorSaida(rs.getDouble("valorSaidaProduto"));
                p1.setDataEntrada(rs.getDate("dataEntradaProduto"));
                p1.setDataSaida(rs.getDate("dataSaidaProduto"));
                p1.setPeso(rs.getDouble("pesoProduto"));
                p1.setDataValidade(rs.getString("dataValidadeProduto"));
                p1.setCodigoFornecedor(rs.getInt("codigoFornecedor"));
                list.add(p1.getCodigoBarras());
                list.add(p1.getNomeProduto());
                list.add(p1.getDescricao());
                list.add(p1.getTipo());
                list.add(p1.getQuantidade());
                list.add(p1.getValorEntrada());
                list.add(p1.getValorSaida());
                list.add(p1.getDataEntrada());
                list.add(p1.getDataSaida());
                list.add(p1.getPeso());
                list.add(p1.getDataValidade());
                list.add(p1.getCodigoFornecedor());
            }

            stmt.close();
            conn.close();

            return list;

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }


    }

    @Override
    public ArrayList consultarProdutoFornecedor(String fornecedor) 
            throws SQLException, ClassNotFoundException {

        int refFornecedor = Integer.parseInt(fornecedor);

        Produto p1 = new Produto();
        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;
            ResultSet rs;

            query = "SELECT * FROM produtos WHERE codigoFornecedor = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setInt(1, refFornecedor);

            rs = stmt.executeQuery();

            ArrayList list = new ArrayList();

            while (rs.next()) {
                p1.setCodigoBarras(rs.getString("codigoBarrasProduto"));
                p1.setNomeProduto(rs.getString("nomeProduto"));
                p1.setDescricao(rs.getString("descricaoProduto"));
                p1.setTipo(rs.getString("tipoProduto"));
                p1.setQuantidade(rs.getLong("quantidadeProduto"));
                p1.setValorEntrada(rs.getDouble("valorEntradaProduto"));
                p1.setValorSaida(rs.getDouble("valorSaidaProduto"));
                p1.setDataEntrada(rs.getDate("dataEntradaProduto"));
                p1.setDataSaida(rs.getDate("dataSaidaProduto"));
                p1.setPeso(rs.getDouble("pesoProduto"));
                p1.setDataValidade(rs.getString("dataValidadeProduto"));
                p1.setCodigoFornecedor(rs.getInt("codigoFornecedor"));
                list.add(p1.getCodigoBarras());
                list.add(p1.getNomeProduto());
                list.add(p1.getDescricao());
                list.add(p1.getTipo());
                list.add(p1.getQuantidade());
                list.add(p1.getValorEntrada());
                list.add(p1.getValorSaida());
                list.add(p1.getDataEntrada());
                list.add(p1.getDataSaida());
                list.add(p1.getPeso());
                list.add(p1.getDataValidade());
                list.add(p1.getCodigoFornecedor());
            }

            stmt.close();
            conn.close();

            return list;

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }

    }

    @Override
    public ArrayList consultarProdutoDataEntrada(String dataEntrada) 
            throws SQLException, ClassNotFoundException {
        
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        java.sql.Date refDataEntrada = null;        
        try {
            refDataEntrada = new java.sql.Date(format.parse(dataEntrada).getTime());            
        } catch (ParseException ex) {
            Logger.getLogger(RepositorioProduto.class.getName()).log(Level.SEVERE, null, ex);
        } 
        
        Produto p1 = new Produto();
        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;
            ResultSet rs;

            query = "SELECT * FROM produtos WHERE dataEntradaProduto = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setDate(1, refDataEntrada);

            rs = stmt.executeQuery();

            ArrayList list = new ArrayList();

            while (rs.next()) {
                p1.setCodigoBarras(rs.getString("codigoBarrasProduto"));
                p1.setNomeProduto(rs.getString("nomeProduto"));
                p1.setDescricao(rs.getString("descricaoProduto"));
                p1.setTipo(rs.getString("tipoProduto"));
                p1.setQuantidade(rs.getLong("quantidadeProduto"));
                p1.setValorEntrada(rs.getDouble("valorEntradaProduto"));
                p1.setValorSaida(rs.getDouble("valorSaidaProduto"));
                p1.setDataEntrada(rs.getDate("dataEntradaProduto"));
                p1.setDataSaida(rs.getDate("dataSaidaProduto"));
                p1.setPeso(rs.getDouble("pesoProduto"));
                p1.setDataValidade(rs.getString("dataValidadeProduto"));
                p1.setCodigoFornecedor(rs.getInt("codigoFornecedor"));
                list.add(p1.getCodigoBarras());
                list.add(p1.getNomeProduto());
                list.add(p1.getDescricao());
                list.add(p1.getTipo());
                list.add(p1.getQuantidade());
                list.add(p1.getValorEntrada());
                list.add(p1.getValorSaida());
                list.add(p1.getDataEntrada());
                list.add(p1.getDataSaida());
                list.add(p1.getPeso());
                list.add(p1.getDataValidade());
                list.add(p1.getCodigoFornecedor());
            }

            stmt.close();
            conn.close();

            return list;

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }
    }

    @Override
    public ArrayList consultarProdutoDataValidade(String dataValidade) 
            throws SQLException, ClassNotFoundException {
        
        Produto p1 = new Produto();
        try {
            Connection conn = LinkDB.getConnection();
            String query;
            PreparedStatement stmt;
            ResultSet rs;

            query = "SELECT * FROM produtos WHERE dataValidadeProduto = ?";

            stmt = (PreparedStatement) conn.prepareStatement(query);

            stmt.setString(1, dataValidade);

            rs = stmt.executeQuery();

            ArrayList list = new ArrayList();

            while (rs.next()) {
                p1.setCodigoBarras(rs.getString("codigoBarrasProduto"));
                p1.setNomeProduto(rs.getString("nomeProduto"));
                p1.setDescricao(rs.getString("descricaoProduto"));
                p1.setTipo(rs.getString("tipoProduto"));
                p1.setQuantidade(rs.getLong("quantidadeProduto"));
                p1.setValorEntrada(rs.getDouble("valorEntradaProduto"));
                p1.setValorSaida(rs.getDouble("valorSaidaProduto"));
                p1.setDataEntrada(rs.getDate("dataEntradaProduto"));
                p1.setDataSaida(rs.getDate("dataSaidaProduto"));
                p1.setPeso(rs.getDouble("pesoProduto"));
                p1.setDataValidade(rs.getString("dataValidadeProduto"));
                p1.setCodigoFornecedor(rs.getInt("codigoFornecedor"));
                list.add(p1.getCodigoBarras());
                list.add(p1.getNomeProduto());
                list.add(p1.getDescricao());
                list.add(p1.getTipo());
                list.add(p1.getQuantidade());
                list.add(p1.getValorEntrada());
                list.add(p1.getValorSaida());
                list.add(p1.getDataEntrada());
                list.add(p1.getDataSaida());
                list.add(p1.getPeso());
                list.add(p1.getDataValidade());
                list.add(p1.getCodigoFornecedor());
            }

            stmt.close();
            conn.close();

            return list;

        } catch (SQLException ex) {
            throw new SQLException(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            throw new ClassNotFoundException(ex.getMessage());
        }
    }
}
